/** @file nim_device_def.h
 * @brief 音视频设备 接口相关的常量函数等定义头文件
 * @copyright (c) 2015-2017, NetEase Inc. All rights reserved
 * @author gq
 * @date 2015/4/24
 */

#ifndef NIM_SDK_DLL_EXPORT_HEADERS_NIM_DEVICE_DEF_H_
#define NIM_SDK_DLL_EXPORT_HEADERS_NIM_DEVICE_DEF_H_

#include "public_defines.h"

#ifdef __cplusplus
extern "C" {
#endif
/** @enum NIMDeviceType 设备类型 */
enum NIMDeviceType {
    /// 麦克风设备
    kNIMDeviceTypeAudioIn = 0,
    /// 听筒设备用于播放本地采集音频数据，麦克风试音
    kNIMDeviceTypeAudioOut = 1,
    /// 听筒设备用于通话音频数据（nim_vchat_start_device和nim_vchat_end_device中使用）
    kNIMDeviceTypeAudioOutChat = 2,
    /// 摄像头
    kNIMDeviceTypeVideo = 3,
    /// 声卡声音采集，得到的数据混音到发送的通话声音中(此模式使用条件苛刻不建议使用)
    kNIMDeviceTypeSoundcardCapturer = 4,
    /// 伴音，启动第三方播放器并获取音频数据（只允许存在一个进程钩子）,只混音到发送的通话声音中
    kNIMDeviceTypeAudioHook = 5,
};

/** @enum NIMVideoSubType 视频格式类型 */
enum NIMVideoSubType {
    /// 32位位图格式 存储 (B,G,R,A)...
    kNIMVideoSubTypeARGB = 0,
    /// 24位位图格式 存储 (B,G,R)...
    kNIMVideoSubTypeRGB = 1,
    /// YUV格式，存储 yyyyyyyy...uu...vv...
    kNIMVideoSubTypeI420 = 2,
};

/** @enum NIMDeviceStatus 设备状态类型 */
enum NIMDeviceStatus {
    /// 设备没有变化
    kNIMDeviceStatusNoChange = 0x0,
    /// 设备有变化
    kNIMDeviceStatusChange = 0x1,
    /// 工作设备被移除
    kNIMDeviceStatusWorkRemove = 0x2,
    /// 设备重新启动
    kNIMDeviceStatusReset = 0x4,
    /// 设备开始工作
    kNIMDeviceStatusStart = 0x8,
    /// 设备停止工作
    kNIMDeviceStatusEnd = 0x10,
};

/** @enum NIMAudioDataCbType 音频数据监听类型 */
enum NIMAudioDataCbType {
    /// 实时返回伴音数据，伴音数据保留原始的格式，伴音不再混音到通话数据中，如果还需要可以通过伴音数据通道再回传
    kNIMAudioDataCbTypeHook = 1,
    kNIMAudioDataCbTypeHookAndMic =
        /// 定时返回伴音和麦克风、声卡的混音数据，允许重采样（json中带kNIMDeviceSampleRate和kNIMVolumeWork），返回单声道数据
    2,
};

/** @name json extension params for vchat device key
 * @{
 */
/// string 设备名称
static const char* kNIMDeviceName = "name";
/// string 设备路径
static const char* kNIMDevicePath = "path";
/// int32 采样频率
static const char* kNIMDeviceSampleRate = "sample_rate";
/// int32 采样位深
static const char* kNIMDeviceSampleBit = "sample_bit";
/// 用户id int64
static const char* kNIMDeviceDataUid = "uid";
/// 用户账号 string
static const char* kNIMDeviceDataAccount = "account";
/// int32 画面宽
static const char* kNIMDeviceWidth = "width";
/// int32 画面高
static const char* kNIMDeviceHeight = "height";
/// int32 视频数据类型，NIMVideoSubType
static const char* kNIMVideoSubType = "subtype";
/// string 标识ID
static const char* kNIMDeviceId = "id";
/// int32 大于0标识数据将使用音量参数进行换算(暂时只针对伴音数据)
static const char* kNIMVolumeWork = "volume_work";
/// int 大于0时标记为耳机设备
static const char* kNIMDeviceHeadphone = "headphone";
/** @}*/  // json extension params for vchat device key

/** @typedef void (*nim_vchat_enum_device_devpath_sync_cb_func)(bool ret, NIMDeviceType type, const char *json_extension, const void *user_data)
 * NIM Device 枚举设备返回回调同步接口
 * @param[out] ret 结果代码，true表示成功
 * @param[out] type 设备类型NIMDeviceType，其中kNIMDeviceTypeAudioOut和kNIMDeviceTypeAudioOutChat等效
 * @param[out] json_extension Json string 设备列表，可能为空"", 例：json_extension =
 * "[{"name":"Webcam","path":"\\\\?\\usb......"},{"name":"Webcam2","path":"\\\\?\\usb......"}]
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_vchat_enum_device_devpath_sync_cb_func)(bool ret, enum NIMDeviceType type, const char* json_extension, const void* user_data);

/** @typedef void (*nim_vchat_device_status_cb_func)(enum NIMDeviceType type,
                                                     uint32_t status,
                                                     const char *device_path,
                                                     const char *json_extension,
                                                     const void *user_data)
 * NIM Device 设备状态监听返回接口
 * @param[out] type 设备类型NIMDeviceType，其中kNIMDeviceTypeAudioIn和kNIMDeviceTypeVideo、kNIMDeviceTypeAudioHook有效
 * @param[out] status 为NIMDeviceStatus的多状态
 * @param[out] device_path
 * 当kNIMDeviceStatusReset状态时需要关注此参数，kNIMDeviceStatusReset时有可能选用了非用户选定的设备，这里返回的是重新启动的设备地址
 * @param[out] json_extension 无效的扩展字段
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_vchat_device_status_cb_func)(enum NIMDeviceType type,
    uint32_t status,
    const char* device_path,
    const char* json_extension,
    const void* user_data);

/** @typedef void(*nim_vchat_audio_data_cb_func_ex)(uint64_t time,
                                                    const char *data,
                                                    uint32_t size,
                                                    int channels,
                                                    int rate,
                                                    int volume,
                                                    const char *json_extension,
                                                    const void *user_data)
 * NIM Device 音频数据监听接口
 * @param[out] time 时间毫秒级，暂时无效
 * @param[out] data 音频数据pcm格式
 * @param[out] size data的数据长度
 * @param[out] channels 通道数
 * @param[out] rate 采样频
 * @param[out] volume 音量值0-100
 * @param[out] json_extension 扩展
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_vchat_audio_data_cb_func_ex)(uint64_t time,
    const char* data,
    uint32_t size,
    int channels,
    int rate,
    int volume,
    const char* json_extension,
    const void* user_data);

/** @typedef void (*nim_vchat_start_device_cb_func)(NIMDeviceType type, bool ret, const char *json_extension, const void *user_data)
 * NIM Device 启动设备异步返回接口
 * @param[out] type 设备类型NIMDeviceType
 * @param[out] ret 启动结果，true表示成功
 * @param[out] json_extension 无效的扩展字段
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_vchat_start_device_cb_func)(enum NIMDeviceType type, bool ret, const char* json_extension, const void* user_data);

/** @typedef void (*nim_vchat_audio_data_cb_func)(uint64_t time, const char *data, unsigned int size,
 *                                                const char *json_extension, const void *user_data)
 * NIM Device 音频数据监听接口
 * @param[out] time 时间毫秒级
 * @param[out] data 音频数据pcm格式
 * @param[out] size data的数据长度
 * @param[out] json_extension Json string 返回kNIMDeviceSampleRate
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_vchat_audio_data_cb_func)(uint64_t time, const char* data, uint32_t size, const char* json_extension, const void* user_data);

/** @typedef void (*nim_vchat_video_data_cb_func)(uint64_t time, const char *data, unsigned int size, unsigned int width,
                                                  unsigned int height, const char *json_extension, const void *user_data)
 * NIM Device 视频数据监听接口
 * @param[out] time 时间毫秒级
 * @param[out] data 视频数据，默认为ARGB格式
 * @param[out] size data的数据长度
 * @param[out] width  画面宽度
 * @param[out] height  画面高度
 * @param[out] json_extension Json string
 * kNIMVideoSubType（缺省为kNIMVideoSubTypeARGB），收到对方视频数据返回kNIMDeviceDataUid和kNIMDeviceDataAccount，如果是辅助摄像头数据则返回kNIMDeviceId
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_vchat_video_data_cb_func)(uint64_t time,
    const char* data,
    uint32_t size,
    uint32_t width,
    uint32_t height,
    const char* json_extension,
    const void* user_data);

/** @typedef void(*nim_vchat_audio_effect_opt_cb_func)(int id, bool ret, int code, const char *json_extension, const void *user_data)
 * NIM Device 音效操作结果回调
 * @param[out] id 音效id
 * @param[out] ret 操作结果
 * @param[out] code 错误码
 * @param[out] json_extension 扩展
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_vchat_audio_effect_opt_cb_func)(int id, bool ret, int code, const char* json_extension, const void* user_data);

#ifdef __cplusplus
};
#endif  //__cplusplus
#endif  // NIM_SDK_DLL_EXPORT_HEADERS_NIM_DEVICE_DEF_H_
